<?php

/**
 * APCU 缓存类型
 */
class Apcu {

    /**
     * 缓存是否可用
     *
     * @var boolean
     */
    private $_enable = true;

    /**
     * 构造函数
     */
    public function __construct() {
        // 是否安装了扩展
        if (!extension_loaded('apcu')) {
            throw new Exception('Apcu 扩展没有安装.');
        }
    }

    /**
     * 设置缓存是否可用
     *
     * @param boolean $bool
     */
    public function enable($bool = true) {
        $this->_enable = $bool;
    }

    /**
     * 处理 KEY
     *
     * @param string $key
     * @return string
     */
    private function _key($key) {
        return md5($key);
    }

    /**
     * 设置缓存
     *
     * @param string $key 键名
     * @param mixed $value 值
     * @param int $expire 过期时间,单位秒 0:永远有效
     * @return boolean
     */
    public function set($key, $value, $expire = 0) {
        return apcu_store($this->_key($key), $value, $expire);
    }

    /**
     * 获取缓存
     *
     * @param string $key 键名
     * @return mixed
     */
    public function get($key) {
        // 如果缓存不可用
        if (!$this->_enable) {
            return false;
        }
        return apcu_fetch($this->_key($key));
    }

    /**
     * 批量得到缓存值
     *
     * @param array $key 键数组,如 array('key1','key2')
     * @return unknown
     */
    public function gets($key = array()) {
        $result = array();
        foreach ($key as $k) {
            $result[$k] = $this->get($k);
        }
        return $result;
    }

    /**
     * 整数型数据缓存递增
     *
     * @param string $key 键名
     * @param int $step 递增数量
     * @return mixed
     */
    public function inc($key, $step = 1) {
        // 如果缓存不可用
        if (!$this->_enable) {
            return false;
        }
        return apcu_inc($this->_key($key), $step);
    }

    /**
     * 整数型数据缓存递减
     *
     * @param string $key 键名
     * @param int $step 递增数量
     * @return mixed
     */
    public function dec($key, $step = 1) {
        // 如果缓存不可用
        if (!$this->_enable) {
            return false;
        }
        return apcu_dec($this->_key($key), $step);
    }

    /**
     * 删除缓存
     *
     * @param string $key 键
     * @return boolean
     */
    public function remove($key) {
        return apcu_delete($this->_key($key));
    }

    /**
     * 清空所有
     *
     * @return boolean
     */
    public function clear() {
        return apcu_clear_cache();
    }

    /**
     * 获取apcu信息
     * 
     * @return array
     */
    public function info() {
        return apcu_cache_info();
    }

}
